package com.wanmait.happyheating.util;

import com.alibaba.fastjson.JSON;
import com.wanmait.happyheating.pojo.Admin;
import com.wanmait.happyheating.pojo.Ordersinfo;
import com.wanmait.happyheating.pojo.Workers;
import com.wanmait.happyheating.websocket.WebSocketServer;

import java.io.IOException;
import java.util.List;

/**
 * @date  2021-6-15
 * @author 王梓旭
 * TODO: 21.6.15  这个工具类主要负责通过websocket实现订单的相关消息出现的时候，推推送给目标的群体。
 * 适用情况类比如下：
 * 1.下订单时，将订单消息推送给该订单所在片区的所有空闲维修人员
 * 2.下订单时，系统自动派单，被派单的维修人员收到信息，显示订单相关信息
 * 3.订单长时间无人接单时，业务经理收到信息提示，手动进行派单
 */
public class WebSocketWithOrdersUtils {

    /**
     * 当订单已经被维修人员接单之后，向所有维修人员发送删除这个订单的信息
     * 王梓旭 2021-6-22
     * @param deleteWordAndOrderId 包含“delete”关键字以及订单ID的字符串，例：delete14
     * @param workers 曾经接收这个订单信息的维修工人的集合
     */
    public static void sendDeleteOrderMesToWorkers(String deleteWordAndOrderId,List<Workers> workers){
        //获取对象的信息并给这个对象发送订单信息
        for (Workers worker :
                workers) {
            String key = getWorkerWebSocketKey(worker);
            WebSocketServer webSocketServer = WebSocketServer.getWebSocketMap().get(key);
            //判断用户是否存在
            if (null == webSocketServer){
                continue;
            }
            //尝试给该用户发送信息
            try {
                webSocketServer.sendMessage(deleteWordAndOrderId);
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }


    /**
     * @date  2021-6-15
     * @author 王梓旭
     * TODO: 21.6.15  派单给维修人员的时候提醒维修人员接收了新的订单
     * @param ordersinfo 订单信息
     * @param worker 订单信息
     */
    public static void sendOrderToWorkerOrAdmin(Ordersinfo ordersinfo,Workers worker){
        //将对象转换为Json格式
        String ordersString = JSON.toJSONString(ordersinfo);
        String key = getWorkerWebSocketKey(worker);
        WebSocketServer webSocketServer = WebSocketServer.getWebSocketMap().get(key);
        if (webSocketServer == null) {
            return;
        }
        try {
            webSocketServer.sendMessage(ordersString);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @date  2021-6-15
     * @author 王梓旭
     * 【重载】
     * TODO: 21.6.15  当订单长时间无人接单的时候，发送消息给业务经理，让它进行手动派单
     * @param ordersinfo 长时间没有人接单的订单
     * @param admin 辖区的业务经理
     */
    public static void sendOrderToWorkerOrAdmin(Ordersinfo ordersinfo, Admin admin){
        //将对象转换为Json格式
        String ordersString = JSON.toJSONString(ordersinfo);
        String key = getAdminWebSocketKey(admin);
        WebSocketServer webSocketServer = WebSocketServer.getWebSocketMap().get(key);
        if (webSocketServer == null){
            return;
        }
        try {
            webSocketServer.sendMessage(ordersString);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @date  2021-6-15
     * @author 王梓旭
     * TODO: 21.6.15  【抢单】的时候将订单发送给目标维修工人
     * @param ordersinfo 刚下的订单的详细信息学
     * @param list 符合要求的维修人员的集合
     */
    public static void sendOrderToWorkersWhenGrabbing(Ordersinfo ordersinfo, List<Workers> list){
        //将对象转换为Json格式
        String ordersString = JSON.toJSONString(ordersinfo);
        //获取对象的信息并给这个对象发送订单信息
        for (Workers worker :
                list) {
            String key = getWorkerWebSocketKey(worker);
            WebSocketServer webSocketServer = WebSocketServer.getWebSocketMap().get(key);
            //判断用户是否存在
            if (null == webSocketServer){
                continue;
            }
            //尝试给该用户发送信息
            try {
                webSocketServer.sendMessage(ordersString);
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }


    /**
     * @date  2021-6-15
     * @author 王梓旭
     * TODO: 21.6.15  通过维修工人对象获取维修工人在websocket中的key
     * @param workers 一个维修人员的对象
     * @return String格式如下：【对象类型】【对象名】【对象id】 姓名有可能出现乱码，以后如果有时间可以进行替换
     */
    private static String getWorkerWebSocketKey(Workers workers){
        return "worker" + workers.getWorkerName() + workers.getId();
    }

    /**
     * @date  2021-6-15
     * @author 王梓旭
     * TODO: 21.6.15  通过业务经理对象获取其在websocket中的key
     * @param admin 想要转换的业务经理的对象
     * @return String格式如下：【对象类型】【对象名】【对象id】
     */
    private static String getAdminWebSocketKey(Admin admin){
        return "admin" + admin.getName() + admin.getId();
    }

































}
